import Vue from 'vue'
// 请求配置
const http = uni.$u.http

// 请求拦截器
const requestInterceptor = (config) => {
    // 在发送请求之前做些什么
    config.header = config.header || {}

    // 可以在这里添加全局请求头
    if (config.header['Content-Type']) {
        config.header['Content-Type'] = 'application/json;charset=UTF-8'
    }


    // 获取token
    const token = uni.getStorageSync('token')

    // 如果存在token，则同时添加到请求头和查询参数中
    if (token) {
        // 添加到Authorization头
        config.header['Authorization'] = token

        // 如果请求参数是对象，并且没有显式传入token，则添加到查询参数中
        if (config.params && typeof config.params === 'object' && !('token' in config.params)) {
            // config.params.token = "7719cbad7ccff2a340a890447608f99d"
            config.params.token = token
            config.params.tuiguangid = uni.getStorageSync('tuiguangid') || '';
            config.params.supplierid = uni.getStorageSync('supplierid') || '';
            config.params.app_id = Vue.prototype.getAppId();
            config.params.tguser_id = uni.getStorageSync('tguser_id') || '';
        }
    }

    // 显示loading
    if (config.custom?.loading !== false) {
        uni.showLoading({
            title: '加载中...',
            mask: true
        })
    }
    return config
}

// 响应拦截器
const responseInterceptor = (response) => {
    // 对响应数据做点什么
    if (response.config.custom?.loading !== false) {
        uni.hideLoading()
    }

    const res = response.data

    // 这里可以根据后端的响应格式进行调整
    const successCodes = [200, 1]
    if (!successCodes.includes(res.code)) {
        // token过期
        if (res.code === 401) {
            // 跳转到登录页
            uni.reLaunch({
                url: '/pages/login/login'
            })
            return Promise.reject(new Error('登录已过期，请重新登录'))
        }

        // 托管经营申请相关错误
        if (res.code === 0 && res.msg && res.msg.includes('请申请成为托管经营')) {
            uni.hideLoading()
            // uni.showModal({
            // 	title: '提示',
            // 	content: '您需要先申请成为托管经营者才能使用此功能，是否立即申请？',
            // 	confirmText: '去申请',
            // 	cancelText: '取消',
            // 	success: (modalRes) => {
            // 		if (modalRes.confirm) {
            // 			// 跳转到托管申请页面
            // 			uni.navigateTo({
            // 				url: '/pages/trusteeship/apply'
            // 			})
            // 		}
            // 	}
            // })
            return Promise.reject(new Error(res.msg))
        }

        // 其他错误处理
        uni.showToast({
            title: res.msg || '请求失败',
            icon: 'none',
            duration: 3000
        })
        return Promise.reject(res.msg || 'Error')
    }

    return res
}

// 错误处理
const errorHandler = (error) => {
    uni.hideLoading()

    // 对响应错误做点什么
    let message = '请求失败'
    if (error.errMsg) {
        if (error.errMsg.includes('timeout')) {
            message = '请求超时'
        } else if (error.errMsg.includes('abort')) {
            message = '请求被取消'
        } else if (error.errMsg.includes('fail')) {
            message = '网络连接失败，请检查网络'
        }
    }

    uni.showToast({
        title: message,
        icon: 'none'
    })

    return Promise.reject(error)
}

// 注册拦截器
uni.$u.http.interceptors.request.use(requestInterceptor, errorHandler)
uni.$u.http.interceptors.response.use(responseInterceptor, errorHandler)

// 导出请求方法
export default {
    get(url, data, config = {}) {
        return uni.$u.http.get(url, {
            params: data,
            ...config
        })
    },

    post(url, data, config = {}) {
        return uni.$u.http.post(url, data, config)
    },

    put(url, data, config = {}) {
        return uni.$u.http.put(url, data, config)
    },

    delete(url, data, config = {}) {
        return uni.$u.http.delete(url, {
            data,
            ...config
        })
    },

    upload(url, filePath, name = 'file', formData = {}, config = {}) {
        return uni.$u.http.upload(url, {
            filePath,
            name,
            formData,
            ...config
        })
    },

    download(url, config = {}) {
        return uni.$u.http.download(url, config)
    }
}